﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace PSE.Framework.UI.Settings
{
    /// <summary>
    /// Define um Singleton para manter informações gerais da aplicação (UI), que podem ser setadas ou
    /// consultadas pelos diversos projetos da aplicação, incluindo os módulos e submódulos de negócio
    /// </summary>
    public class CurrentSettings
    {
        /// <summary>
        /// Campo para conter a instãncia única de CurrentSettings (trata-se de um singleton);
        /// </summary>
        private static CurrentSettings _settings = null;

        /// <summary>
        /// Mutex para controle ao acesso da instãncia única
        /// </summary>
        private static Mutex _mutex = new Mutex();

        /// <summary>
        /// Construtor privado, não acessível por ser um singleton
        /// </summary>
        public CurrentSettings()
        {
        }

        /// <summary>
        /// Método para obter instância única do objeto (singleton)
        /// </summary>
        /// <returns>Instãncia do tipo CurrentSettings</returns>
        protected static T GetInstance<T>()
            where T : CurrentSettings, new()
        {
            _mutex.WaitOne();

            if (_settings == null)
            {
                _settings = new T();
            }

            _mutex.ReleaseMutex();

            return (T)_settings;
        }

        public static CurrentSettings GetInstance()
        {
            return GetInstance<CurrentSettings>();
        }

        #region Propriedades

        private int _currentZoom = 100;
        /// <summary>
        /// Zoom atual da aplicação (CurrentZoom)
        /// </summary>
        public int CurrentZoom 
        {
            get { return _currentZoom; }
            set { _currentZoom = value; }
        }

        private string _currentTheme = null;

        /// <summary>
        /// Tema atual da aplicação
        /// </summary>
        public string CurrentTheme
        {
            get { return _currentTheme; }
            set { _currentTheme = value; }
        }

        private string _currentLanguage = null;

        /// <summary>
        /// Idioma atual da aplicação
        /// </summary>
        public string CurrentLanguage
        {
            get { return _currentLanguage; }
            set { _currentLanguage = value; }
        }

        #endregion
    }
}
